package cn.com.huzo.repository.trade;

import cn.com.huzo.model.entities.trade.ProductionInstructionLinesColourOrderEntity;
import cn.com.huzo.model.entities.trade.ProductionInstructionLinesEntity;
import huzofw.repository.GenericRepository;
import java.util.List;
import java.util.Map;

/**
 * 生产指示书明细访问对象接口。
 *
 * @author 吴旭
 */
public interface ProductionInstructionLinesRepository extends GenericRepository<ProductionInstructionLinesEntity, String> {

    /**
     * 取得明细中合同数及样品数
     *
     * @param headerId 生产指示书ID
     * @return 合同数、样品数
     */
    Map<String, Object> fetchTotalQuantityByHeaderId(Long headerId);

    /**
     * 根据生产指示书ID及款号取得明细（单款明细）
     *
     * @param headerId 生产指示书ID
     * @param styleNo 款号
     * @return 生产指示书明细
     */
    List<ProductionInstructionLinesEntity> fetchLinesByHeaderIdAndStyleNo(Long headerId, String styleNo);

    /**
     * 取得该生产指示书明细的打印数据
     *
     * @param headerId 生产指示书ID
     * @return 生产指示书明细打印数据
     */
    List<ProductionInstructionLinesEntity> fetchLinesPrintData(Long headerId);

    /**
     * 根据已有颜色增加新颜色行（相当于拷贝粘贴功能）
     *
     * @param headerId 生产指示书ID
     * @param colourId 新增的颜色ID
     * @return 影响行数
     */
    Integer insertLinesByNewColour(Long headerId, Long colourId);

    /**
     * 更新生产指示书明细
     *
     * @param itemList 要更新的数据
     * @return 影响行数
     */
    Integer updateLines(List<ProductionInstructionLinesEntity> itemList);

    /**
     * 更新生产指示书明细（颜色）
     *
     * @param itemList 要更新的数据
     * @return 影响行数
     */
    Integer updateLinesColour(List<ProductionInstructionLinesEntity> itemList);

    /**
     * 更新颜色后同步颜色顺序表
     *
     * @param headerId 生产指示书ID
     * @return 影响行数
     */
    Integer syncDeleteLinesColourOrder(Long headerId);

    /**
     * 更新生产指示书明细（唛头号）
     *
     * @param itemList 要更新的数据
     * @return 影响行数
     */
    Integer updateLinesShippingMarkNo(List<ProductionInstructionLinesEntity> itemList);

    /**
     * 根据给定的生产指示书ID，取得明细中分配的成品颜色数据
     * <p>
     * @param headerId 生产指示书ID
     * @return 成品颜色数据
     */
    List<Map<String, Object>> fetchProductColourFromMoByHeaderId(Long headerId);

    /**
     * 根据给定的款号取得对应生产指示书中分配的成品颜色数据
     * <p>
     * @param productId 产品标识
     * @return 成品颜色数据
     */
    List<Map<String, Object>> fetchProductColourFromMoByProductId(Long productId);

    /**
     * 取得该生产指示书中每色最大行
     * <p>
     * @param headerId 生产指示书ID
     * @return 每色最大行
     */
    Integer fetchMaxRowNumPerColour(Long headerId);

    /**
     * 根据该生产指示书的款号得到对应的产品尺码（全部尺码，有可能不同色有不同的尺码，这里不做区分）
     *
     * @param headerId 生产指示书ID
     * @param styleNo 款号
     * @return 对应的尺码
     */
    List<Map<String, Object>> fetchProductSizeByMoHeaderIdAndStyleNo(Long headerId, String styleNo);

    /**
     * 根据给定的款号取得对应生产指示书中分配的成品尺码数据
     * <p>
     * @param productId 产品标识
     * @return 成品颜色数据
     */
    List<Map<String, Object>> fetchProductSizeFromMoByProductId(Long productId);

    /**
     * 得到指定的生产指示书中，某色分配的生产数量
     * <p>
     * @param headerId 生产指示书ID
     * @param colourId 产品颜色标识
     * @return
     */
    Map<String, Object> fetchProductQuantityByColour(Long headerId, Long colourId);

    /**
     * 得到指定的生产指示书中，某色分配的生产数量
     * <p>
     * @param moHeaderId 生产指示书ID
     * @param colourId 颜色ID
     * @return
     */
    Map<String, Object> fetchProductQuantityPerColour(Long moHeaderId, Long colourId);

    /**
     * 插入生产指示书明细颜色顺序
     *
     * @param itemList 要插入的数据
     * @return 影响行数
     */
    Integer insertLinesColourOrder(List<Map<String, Object>> itemList);

    /**
     * 新增颜色加入到颜色顺序表
     *
     * @param headerId 生产指示书ID
     * @return
     */
    Integer insertColourOrderLinesByNewColour(Long headerId);

    /**
     * 重设颜色排序
     *
     * @param itemList 排序数据
     * @return
     */
    Integer updateLinesColourOrder(List<Map<String, Object>> itemList);

    /**
     * 取得该生产指示书的颜色顺序
     *
     * @param headerId 生产指示书ID
     * @return
     */
    List<ProductionInstructionLinesColourOrderEntity> fetchLinesColourOrderByHeaderId(Long headerId);

    /**
     * 删除颜色排序
     *
     * @param headerId 生产指示书ID
     * @return
     */
    Integer deleteLinesColourOrder(Long headerId);

    // <editor-fold defaultstate="collapsed" desc="物料需求相关用">
    /**
     * 取得该生产指示书明细（颜色，数量）
     *
     * @param headerId 生产指示书ID
     * @return 生产指示书明细（颜色，数量）
     */
    List<Map<String, Object>> fetchProductQuantityWithColour(Long headerId);

    /**
     * 取得该生产指示书产品信息（带尺码）
     *
     * @param headerId 生产指示书ID
     * @param productId 产品ID
     * @return 取得该生产指示书产品信息
     */
    Map<String, Object> fetchProductInfoWithSize(Long headerId, Long productId);
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="订单相关用">
    /**
     * 根据订单ID得到该订单所属各款的生产指示书成品颜色数目
     * <p>
     * @param poHeaderId 订单ID
     * @return 颜色数目
     */
    Integer fetchMaxColourNumFromMoByPoHeaderId(Long poHeaderId);

    /**
     * 根据订单ID得到该订单所属各款的生产指示书成品颜色
     *
     * @param poHeaderId 订单ID
     * @return 款对应成品颜色
     */
    List<Map<String, Object>> fetchProductColourFromMoByPoHeaderId(Long poHeaderId);

    /**
     * 根据订单ID得到该订单所属各款的生产指示书产品尺码
     *
     * @param poHeaderId 订单ID
     * @return 各款对应的尺码
     */
    List<Map<String, Object>> fetchProductSizeFromMoByPoHeaderId(Long poHeaderId);

    /**
     * 根据订单ID得到该订单所属各款的生产指示书对应的颜色尺码数量
     *
     * @param poHeaderId 订单ID
     * @return 各款对应的颜色尺码数量
     */
    List<Map<String, Object>> fetchProductQuantityFromMoByPoHeaderId(Long poHeaderId);
    // </editor-fold>
}
